// : v.book.read.tip.state.demo2.StateDemo.java
package v.book.read.tip.state.demo2;

import junit.framework.TestCase;

/**
 * 演示 State 模式的基本结构
 * @author 小败
 */
interface State {
    void operation1();

    void operation2();

    void operation3();
}


class ServiceProvider {
    private State state;

    public ServiceProvider(State state) {
        this.state = state;
    }

    public void changeState(State newState) {
        state = newState;
    }

    // Pass method calls to the implementation:
    public void service1() {
        // ...
        state.operation1();
        // ...
        state.operation3();
    }

    public void service2() {
        // ...
        state.operation1();
        // ...
        state.operation2();
    }

    public void service3() {
        // ...
        state.operation3();
        // ...
        state.operation2();
    }
}


class Implementation1 implements State {
    public void operation1() {
        System.out.println("Implementation1.operation1()");
    }

    public void operation2() {
        System.out.println("Implementation1.operation2()");
    }

    public void operation3() {
        System.out.println("Implementation1.operation3()");
    }
}


class Implementation2 implements State {
    public void operation1() {
        System.out.println("Implementation2.operation1()");
    }

    public void operation2() {
        System.out.println("Implementation2.operation2()");
    }

    public void operation3() {
        System.out.println("Implementation2.operation3()");
    }
}


public class StateDemo extends TestCase {
    static void run(ServiceProvider sp) {
        sp.service1();
        sp.service2();
        sp.service3();
    }

    ServiceProvider sp = new ServiceProvider(new Implementation1());

    public void test() {
        run(sp);
        sp.changeState(new Implementation2());
        run(sp);
    }

    public static void main(String args[]) {
        junit.textui.TestRunner.run(StateDemo.class);
    }
} // /:~
